"""
@name : 双人制对战游戏
@author : chenwenying
@projectname: 1、面向对象.py
@time : 2022/7/7
"""
import random
import time

'''
脚本介绍：此脚本为线上测试脚本，玩家只能和人机对决
游戏特点：开始游戏需要先加入房间，加入房间的条件是你创建过房间，一旦开始就只能等待结束
脚本缺陷：每个终端创建人物，但是实例对象都是role1，会覆盖别人信息，房间的创建也是一样的问题
'''


class CreateRole:
    def __init__(self, role_name, sex):
        # 角色名字
        self.name = role_name
        # 角色性别
        self.sex = sex
        # 角色默认血量
        self.blood = 30
        # 角色装备  True：有  、False：没有
        self.equ = False
        # 角色默认拥有的金币数量
        self.money = 20
        # 一个角色只能创建一个房间
        self.create_room = False
        # 角色是否被创建，用于后面判断，角色被创建了才能创建房间、购买装备
        self.status = False
        self.in_room = False

    # role为对手
    def battle(self, role):
        # 对手有装备 血量 -5
        if role.equ:
            role.blood -= 5

        # 对手没有装备  血量 -10
        else:
            role.blood -= 10


class CreateRoom:
    def __init__(self, room_name):
        # 房间名字
        self.room_name = room_name
        # 房间人数 最多两个
        self.people_num = 0
        # 房间中有哪些人，以及角色对应代码地址 id()
        self.people = {}


# 人机角色
role0 = CreateRole("东方曜", "F")
# 创建了哪些角色，‘东方曜’人机
role = ["东方曜"]
# 创建了哪些房间，以及房间对应的代码地址 id()
room = {}


# 主函数
if __name__ == "__main__":
    while 1:
        print('''
    ################
    1.创建角色
    2.加入房间
    3.开始游戏
    4.购买装备
    5.退出
    ################
        ''')
        opt = input("请输入您的选择:")
        if opt.isdigit() and 0 < int(opt) < 6 and len(opt) == 1:
            if opt == '1':
                # 判断用户是否创建了角色，一次只能创建一个角色
                if len(role) == 1:
                    role_name = input("请输入您的名字:")
                    sex = input("请输入您的性别(F/M):")
                    if sex in ['F', 'M']:
                        if role_name not in role:
                            # 将角色进行实例化
                            role1 = CreateRole(role_name, sex)
                            print(f'''
                            角色创建成功！
                            name:{role_name}
                            sex:{sex}
                            blood:{role1.blood}
                            ''')
                            # 用于判断用户是否创建
                            role.append(role_name)
                            role1.status = True

                        else:
                            print("该角色已经被创建！")
                    else:
                        print("输入不合法！")
                else:
                    print("您已经创建过角色了，不可以重复创建！")

            elif opt == '2':
                try:
                    # 创建了用户才能创建房间
                    if role1.status:
                        # 每个用户需要创建一个房间
                        if not role1.create_room:
                            room_name = input("请输入房间名字:")
                            # 创建的房间名是唯一的
                            if room_name not in room:
                                room1 = CreateRoom(room_name)
                                # 房间创建好，会在字典对象中添加房间名和房间代码所在位置 id
                                room[room_name] = room1
                                role1.create_room = True
                                # 创建房间，默认角色创建完房间以后都是在自己的房间里
                                role1.in_room = room1.room_name
                                print(f'''
                            房间创建成功！
                            房间名：{room_name}
                                ''')
                                # 将人机添加到房间
                                room1.people[0] = role0
                                room1.people_num += 1
                                # 将创建的角色加入房间
                                room1.people[1] = role1
                                room1.people_num += 1

                            else:
                                print("该房间已经被创建了！")

                        else:
                            # 用户一旦创建房间，就在自己创建的房间里
                            if not role1.in_room:
                                print("以下是可以加入的房间:")
                                for i in room:
                                    if room[i].people_num < 2:
                                        print(i)
                                    enter = input("您要加入哪个房间:")
                                    if enter in room:
                                        if room[enter].people:
                                            room[enter].people[1] = role1
                                            room[i].people_num += 1
                                            role1.in_room = room[enter].room_name

                                        else:
                                            room[enter].people[0] = role1
                                            room[i].people_num += 1

                                    else:
                                        print("该房间不存在或者该房间人数已满！")

                            else:
                                print("你现在已经在房间了")

                except NameError:
                    print("请先创建角色！")

            elif opt == '3':
                try:
                    if role1.in_room:
                        choice = input("游戏即将开始，是否需要换房间[y/n]：")
                        if choice == 'n':
                            # 对房间进行循环原因：当多人同时在线时，只要一个房间人数为2是自动开始游戏
                            for j in room:
                                if len(room[j].people) == 2:
                                    print("3s后将开始游戏，请做好准备！".center(70, ' '))
                                    for i in [3, 2, 1]:
                                        print(str(i).center(70, ' '))
                                        time.sleep(i)
                                        num = 1
                                    while room[j].people[0].blood > 0 and room[j].people[1].blood > 0:
                                        select1 = random.choice([0, 1])
                                        select2 = random.choice([0, 1])
                                        print(f"第{num}回合".center(70, '-'))
                                        if select1 == 0 and select2 == 0:
                                            print("*两个人都在分析对象的下一步动作*".center(70, ' '))

                                        elif select1 == 0 and select2 == 1:
                                            room[j].people[0].battle(room[j].people[1])
                                            print(f"*{room[j].people[0].name} 对 {room[j].people[1].name}发动了攻击！*".center(70, ' '))

                                        elif select1 == 1 and select2 == 0:
                                            room[j].people[1].battle(room[j].people[0])
                                            print(f"*{room[j].people[1].name} 对 {room[j].people[0].name}发动了攻击！*".center(70, ' '))

                                        else:
                                            room[j].people[1].battle(room[j].people[0])
                                            room[j].people[0].battle(room[j].people[1])
                                            print("*双方同时发动攻击，真有看点！*".center(70, ' '))

                                        print(f"{room[j].people[0].name}剩余血量:{room[j].people[0].blood}")
                                        print(f"{room[j].people[1].name}剩余血量:{room[j].people[1].blood}")
                                        num += 1
                                        time.sleep(0.5)

                                    if room[j].people[0].blood <= 0 and room[j].people[1].blood > 0:
                                        print(f"{room[j].people[1].name}获胜！")
                                    elif room[j].people[0].blood > 0 and room[j].people[1].blood <= 0:
                                        print(f"{room[j].people[0].name}获胜！")
                                    else:
                                        print("这一场为平局，双方都很棒！")
                                    # 恢复血量
                                    role0.blood = 30
                                    role1.blood = 30
                        else:
                            room[role1.in_room].people.pop(1)
                            room[role1.in_room].people_num -= 1
                            role1.in_room = False

                except NameError:
                    print("加入房间才能开始游戏！")

            elif opt == '4':
                try:
                    if role1.status:
                        if not role1.equ:
                            print("**护盾铠甲：这件装备可以让你防御对方5点攻击")
                            print("**价格:20金币")
                            option = input("是否购买此装备(y/n):")
                            if option == 'y':
                                role1.equ = True
                                role1.money -= 20
                                print("购买成功！")
                        else:
                            print("您已经购买过了，不可重复买！")
                except NameError:
                    print("请先创建角色！")

            else:
                print("玩得开心接着来，免费不要钱！")
                break
        else:
            print("请输入1-5中的一个数字！")